home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
others
/
crypt
/
pgp26uib
/
contrib
/
misc
/
pgppager.c
< prev
Wrap
C/C++ Source or Header
|
1994-06-19
|
5KB
|
205 lines
/* pgppager, designed to be possibly integrated with elm mail reader
*
* by Alessandro Bottonelli (c)1993, A.Bottonelli@it12.bull.it
* version 1.0 - 29/Jan/93
*
* This program is put in the public domain and permission is granted
* to use it for any purpose, provided this copyright notice is retained.
* NO WARRANTIES expressed or implied are given. USE THIS PROGRAM AT
* YOUR OWN RISK!
*
* This programs reads from a specified file or from stdin if no file is
* specified and creates three temporary files (header, encrypted, and
* trailer) as needed, in order to store the header portion in cleartext,
* the encrypted portion still in cypher text, and the trailer portion of
* the clear text. Then, if applicable, the cleartext header is outputted,
* the encrypted portion is piped through pgp as needed, then the trailer
* (if any) is outputted. THIS PROCESS IS TRANSPARENT TO NON PGP ENCRYPTED
* TEXTS
*
* For use with ELM, it is necessary to specify the display to be:
*
* <whatever_path>/pgppager | pg
*
* in the elm option menu.
*
*/
#include <stdio.h>
/*
* you may need to customize the next DEFINEs
*/
#define PGP "/usr/local/bin/pgp -f"
#define BEGIN "-----BEGIN PGP MESSAGE---"
#define END "-----END PGP MESSAGE---"
#define TEMP "/usr/tmp" /* Temporary dir of your choice */
#define CAT "cat -s" /* -s option to avoid cat complaining */
/* about missing files */
/*
* program should be invoked as "pgppager [file] | pg"
* actually no check is made to verify that the program
* is piped through "pg" or "more", just in case someone
* wants to redirect it to a file or a printer.
* BEWARE: redirecting it to a file or printer may be
* not good for your security if the file or printer level
* of security is unknown or poor ...
*/
/*
* This three variables global to be visible to the Exit() routine
*/
char fh[128]; /* Header temporary file */
char fe[128]; /* Encrypted temporary file */
char fr[128]; /* Trailer temporary file */
main(ac,av)
int ac;
char **av;
{
FILE *fp; /* File pointer to read file(s) */
FILE *ft; /* File pointer to temp file(s) */
char line[256]; /* Read/Write buffer */
char cmd[128]; /* command string */
/*
* Must be invoked as "pgppager [file_name]"
*/
if ( ac > 2 )
{
fprintf(stderr,"Usage: %s [file_name]\n", av[0]);
Exit(1);
}
/*
* File ( if specified ) must exist and be readable
*/
if ( ac == 2 )
{
if ( ( fp = fopen( av[1], "r") ) == NULL )
{
fprintf(stderr,"%s: cannot read %s\n", av[0], av[1]);
Exit(2);
}
}
else
fp=stdin; /* if no file specified assume standard input */
/*
* Build temporary file names
*
* please note how, as files are created for writing, they are
* also chmod(ed) to 0600. I expect most PGP users to have their
* umask set to 077, but just to be on the safe side ... :-)
*/
sprintf ( fh, "%s/pgpm.head.%d", TEMP, (int )getpid() );
sprintf ( fe, "%s/pgpm.encr.%d", TEMP, (int )getpid() );
sprintf ( fr, "%s/pgpm.trai.%d", TEMP, (int )getpid() );
/*
* READ file until Eof, redirect to "fe" only those portions of the
* file that are between the BEGIN PGP and END PGP MESSAGE lines.
*/
if ( ( ft = fopen ( fh, "w") ) == NULL )
{
fprintf(stderr,"%s: error opening temp file\n", av[0]);
Exit(4);
}
if ( (int )chmod( fh, 0600) != 0 )
{
fprintf(stderr,"%s: cannot chmod temp file\n", av[0]);
Exit(5);
}
fprintf( ft, "\n"); /* Just to start with a blank line */
while ( fgets( line, 128, fp) != NULL )
{
if ( !strncmp( BEGIN, line, strlen( BEGIN) ))
{
fprintf(ft, "\n===pgp encrypted message begins===\n");
fclose(ft);
if ( ( ft = fopen ( fe, "w") ) == NULL )
{
fprintf(stderr,"%s: error opening temp file\n", av[0]);
Exit(4);
}
if ( (int )chmod( fe, 0600) != 0 )
{
fprintf(stderr,"%s: cannot chmod temp file\n", av[0]);
Exit(5);
}
}
fprintf( ft, "%s", line);
if ( !strncmp( END, line, strlen( END) ))
{
fclose(ft);
if ( ( ft = fopen ( fr, "w") ) == NULL )
{
fprintf(stderr,"%s: error opening temp file\n", av[0]);
Exit(4);
}
if ( (int )chmod( fr, 0600) != 0 )
{
fprintf(stderr,"%s: cannot chmod temp file\n", av[0]);
Exit(5);
}
fprintf(ft, "\n===pgp encrypted message ends===\n");
}
}
fclose(fp);
fclose(ft);
sprintf( cmd, "%s %s", CAT, fh);
system(cmd);
sprintf( cmd, "%s %s | %s", CAT, fe, PGP);
system(cmd);
sprintf( cmd, "%s %s", CAT, fr);
system(cmd);
Exit(0); /* That's all folks ... */
}
/*
* Exit(s) are centralized in this routine to make sure we wipe out
* temporary files in any case ...
*/
Exit(n)
int n; /* value to be returned to the shell (0 = OK) */
{
/*
* Remove temporary files (if any)
* and sync() just for the sake of it
*/
unlink(fh);
unlink(fe);
unlink(fr);
sync();
exit(n);
}